package com.zhao.calculator;

import java.util.LinkedList;
import java.util.List;

/**
 * 字符串计算器
 * 输入一个计算公式的字符串
 * 输出计算结果
 * @author zhao
 */
public class StringCalculator {
    //数字表
    private List<Double> numList=new LinkedList<Double>();
    //符号表
    private List<Character> signList=new LinkedList<Character>();
    /**
     * 传入一个运算式字符串
     * 返回计算的结果
     * @param str 传入的运算字符串
     * @return 计算结果Double类型
     * @throws InputInfoException 当用户输入的内容与格式不匹配时抛出此异常
     */
    public double cal(String  str) throws InputInfoException{
        //判断第一个字符是否为数字 不是则报错
        if(!isNumber(str.charAt(0)))
            throw new InputInfoException();
        //循环字符串的每一个字符 将数字和符号隔开
        for (int i=0;i<str.length();){
            char ch=str.charAt(i);
            //如果是数字循环遍历到非数字的字符
            if(isNumber(ch)){
                StringBuffer sb=new StringBuffer();
                for(;i<str.length()&&isNumber(str.charAt(i));i++){
                    ch=str.charAt(i);
                    sb.append(ch);
                }
                //添加到数字表中
                numList.add(Double.valueOf(sb+""));
            }else{
                //符号处理 如果符号的下一个字符不是接数字抛出异常
                if(!isNumber(str.charAt(i+1)))
                    throw new InputInfoException();
                //将符号添加到符号表当中
                signList.add(str.charAt(i));
                i++;
            }
        }
        //使用数字表和符号表进行逻辑运算
        if(numList.size()==1){
            return numList.get(0);
        }
        //乘法除法优先运算
        for(int i=0;i<signList.size();i++){
            char ch=signList.get(i);
            Double buffer=new Double(0);
            if(ch!='×'&&ch!='÷')
                continue;
            switch(ch){
                case '×':
                    buffer=numList.get(i)*numList.get(i+1);
                    break;
                case '÷':
                    buffer=numList.get(i)/numList.get(i+1);
                    break;
            }
            signList.remove(i);
            numList.remove(i);
            numList.remove(i);
            numList.add(i, buffer);
            i=-1;
        }
        //加法减法运算运算
        double buffer=numList.get(0);
        for(int i=0;i<signList.size();i++){
            switch(signList.get(i)){
                case '+':
                    buffer+=numList.get(i+1);
                    break;
                case '-':
                    buffer-=numList.get(i+1);
                    break;
            }
        }
        numList.clear();
        signList.clear();
        return buffer;
    }
    public boolean isNumber(char ch){
        if((ch<='9'&&ch>='0')||ch=='.')
            return true;
        return false;
    }
    public static void main(String[] args) {
        StringCalculator sc=new StringCalculator();
        try {
            //× ÷
            double d=sc.cal("1+2×3+2");
            System.out.println(d);
        } catch (InputInfoException e) {
            // TODO Auto-generated catch block
            System.out.println("格式错误！");
        }
    }
}
